package com.chen.common.websocket.handler;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * SpringBoot 原生方式使用 WebSocket 示例
 * 注：如要使用，则需注册到Spring容器中
 * {@link ServerEndpoint} 该注解可以将类定义成一个WebSocket服务器端
 */
@Slf4j
//@ServerEndpoint("/ws/primary/{userId}")
@Deprecated
public class WebSocketEndpoint {

    /**
     * concurrent包下线程安全的Map
     */
    public static final Map<String,Session> SESSION_MAP = new ConcurrentHashMap<>();

    /**
     * {@link OnOpen} 表示有浏览器链接过来的时候被调用
     */
    @OnOpen
    public void onOpen(Session session, @PathParam(value = "userId") String userId) {
        SESSION_MAP.put(userId,session);
        log.info("【WebSocket】 -> 用户{}开启连接, 总连接数: {}", userId, SESSION_MAP.size());
    }

    /**
     * {@link OnClose} 表示浏览器发出关闭请求的时候被调用
     */
    @OnClose
    public void onClose(Session session, @PathParam(value = "userId") String userId) {
        SESSION_MAP.remove(userId);
        log.info("【WebSocket】 -> 用户{}关闭连接, 总连接数: {}", userId, SESSION_MAP.size());
    }

    /**
     * {@link OnMessage} 表示浏览器发消息的时候被调用
     */
    @OnMessage
    public void onMessage(String message, Session session, @PathParam(value = "userId") String userId) {
        log.info("【WebSocket】: message -> {}, userId -> {}",message,userId);
    }

    /**
     * {@link OnError} 表示报错了
     */
    @OnError
    public void onError(Session session, Throwable error) {
        error.printStackTrace();
    }

    /**
     * 指定发消息
     * @param userId userId
     * @param message 消息
     */
    @SneakyThrows
    public static void sendMessage(String userId, String message) {
        Session se = SESSION_MAP.get(userId);
        if (se != null){
            se.getBasicRemote().sendText(message);
        }
    }

    /**
     * 群发消息
     * @param message 消息
     */
    public static void massHairMsg(String message) {
        for (String userId : SESSION_MAP.keySet()) {
            sendMessage(userId,message);
        }
    }
}